/*
 *  ClientDataHandler.c
 *  farfetchproject
 *
 *  Created by Rodrigo Souza on 4/27/10.
 *  Copyright 2010 Unicamp. All rights reserved.
 *
 */

/* Return the movie's Sinopse. */
MoviesList* getSinopse(char* registry) {
	MoviesList *list;
	if ((list = (MoviesList *) malloc(sizeof(MoviesList)*1)) == NULL) {
		printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
		exit;
	}
	
	if ((list[0] = (Movie *) malloc(sizeof(Movie))) == NULL) {
		printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
		exit;
	}
	
	list[0]->id = -1;
	list[0]->title = "";
	list[0]->sinopse = (char*) malloc(sizeof(char) * strlen(registry));
	strcpy(list[0]->sinopse, registry);
	list[0]->room = "";
	list[0]->hours = "";
	list[0]->rate = -1;
	list[0]->clients = -1;
		
	return list;
}


/* Developing method to return a printable fake movie. */
MoviesList* getRate(char* registry) {
	MoviesList *list;
	if ((list = (MoviesList *) malloc(sizeof(MoviesList)*1)) == NULL) {
		printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
		exit;
	}
	
	if ((list[0] = (Movie *) malloc(sizeof(Movie))) == NULL) {
		printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
		exit;
	}
	
	list[0]->id = -1;
	list[0]->sinopse = "";
	list[0]->room = "";
	list[0]->hours = "";
		
	char *str = strtok(registry, "|");
	int size = strlen(str);
	list[0]->title = (char*) malloc(sizeof(char)*size);
	strcpy(list[0]->title, str);	
	
	str = strtok(NULL, "|");
	list[0]->rate = atof(str);
		
	str = strtok(NULL, "|");
	list[0]->clients = atoi(str);
		
	return list;
}


/* Get a Movie struct from string. */
MoviesList* getMovie(char* registry){
	MoviesList *list;
	if ((list = (MoviesList *) malloc(sizeof(MoviesList))) == NULL) {
		printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
		exit;
	}
	
	if ((list[0] = (Movie *) malloc(sizeof(Movie))) == NULL) {
		printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
		exit;
	}
	
	if (registry != NULL){
		int size = 0;
		
		char *str = strtok(registry, "|");
		list[0]->id = atoi(str);
		
		str = strtok(NULL, "|");		
		size = strlen(str);
		list[0]->title = (char*) malloc(sizeof(char)*size);
		strcpy(list[0]->title, str);
		
		str = strtok(NULL, "|");
		size = strlen(str);
		list[0]->sinopse = (char*) malloc(sizeof(char)*size);
		strcpy(list[0]->sinopse, str);
		
		str = strtok(NULL, "|");
		size = strlen(str);
		list[0]->room = (char*) malloc(sizeof(char)*size);
		strcpy(list[0]->room, str);
		
		str = strtok(NULL, "|");
		size = strlen(str);
		list[0]->hours = (char*) malloc(sizeof(char)*size);
		strcpy(list[0]->hours, str);
		
		str = strtok(NULL, "|");
		list[0]->rate = atof(str);
		
		str = strtok(NULL, "|");
		list[0]->clients = atoi(str);
	}
	
	return list;
}

/* Get a list with all the Movies titles and ids. */
MoviesList* getMoviesIdAndTitleList(char* registry, int *movieNumber){
	if(registry != NULL){
		MoviesList* list;
		char *str = strtok(registry, "|");
		*movieNumber = atoi(str);
		
		if ((list = (MoviesList *) malloc(*movieNumber*sizeof(MoviesList))) == NULL) {
			printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
			exit;
		}
		
		int i;
		for(i = 0; i < *movieNumber; i++){
			if ((list[i] = (Movie *) malloc(sizeof(Movie))) == NULL) {
				printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
				exit;
			}
			str = strtok(NULL, "|");
			list[i]->id = atoi(str);
			
			str = strtok(NULL, "|");		
			int size = strlen(str);
			list[i]->title = (char*) malloc(sizeof(char)*size);
			strcpy(list[i]->title, str);		
		}
	
		return list;
	}
	return NULL;
}

/* Get a list with all the Movies information. */
MoviesList* getMoviesList(char* registry, int *movieNumber){

	if(registry != NULL){
		MoviesList* list;
		char *str = strtok(registry, "|");
		*movieNumber = atoi(str);
				
		if ((list = (MoviesList *) malloc(*movieNumber*sizeof(MoviesList))) == NULL) {
			printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
			exit;
		}
		int i = 0;
		for(i = 0; i < *movieNumber; i++){
			if ((list[i] = (Movie *) malloc(sizeof(Movie))) == NULL) {
				printf("Erro: não há memória disponível! Compre uma máquina nova urgentemente!\n");
				exit;
			}
			str = strtok(NULL, "|");
			list[i]->id = atoi(str);
			
			str = strtok(NULL, "|");		
			int size = strlen(str);
			list[i]->title = (char*) malloc(sizeof(char)*size);
			strcpy(list[i]->title, str);
			
			str = strtok(NULL, "|");
			size = strlen(str);
			list[i]->sinopse = (char*) malloc(sizeof(char)*size);
			strcpy(list[i]->sinopse, str);
			
			str = strtok(NULL, "|");
			size = strlen(str);
			list[i]->room = (char*) malloc(sizeof(char)*size);
			strcpy(list[i]->room, str);
			
			str = strtok(NULL, "|");
			size = strlen(str);
			list[i]->hours = (char*) malloc(sizeof(char)*size);
			strcpy(list[i]->hours, str);
			
			str = strtok(NULL, "|");
			list[i]->rate = atof(str);
			
			str = strtok(NULL, "|");
			list[i]->clients = atoi(str);
		}
		return list;
	}
	return NULL;
}

/* Transform the received data into something the interface can use. */
MoviesList* getData(char *recvline, int *count, int option) {
	switch (option) {
		case 1:
			return getMoviesIdAndTitleList(recvline, count);
		case 2:
			return getMoviesList(recvline, count);
		case 3:
			return getSinopse(recvline);
		case 4:
			return getMovie(recvline);
		case 5:
			return getRate(recvline);
		default:
			break;
	}
}
